#!/usr/bin/env python2.4
# coding: utf-8

from zope import interface, component

class IOperacoesInteiros(interface.Interface):

    def somar(a, b):
        """soma dois inteiros"""

    def subtrair(a, b):
        """subtrai dois inteiros"""

    def multiplicar(a, b):
        """multiplica dois inteiros"""

    def dividir(a, b):
        """divide dois inteiros"""

class Calculadora:

    interface.implements(IOperacoesInteiros)

    def somar(self, a, b):
        return a + b

    def subtrair(self, a, b):
        return a - b

    def multiplicar(self, a, b):
        return a * b

    def dividir(self, a, b):
        return a//b

calc = Calculadora() # sem usar a AC

# para usar a AC, registrar o componente
component.provideUtility(Calculadora())

calc = component.getUtility(IOperacoesInteiros)
print "Divisão:", calc.dividir(23, 5)

# uso de um adaptador para extender um componente

class IModulador(interface.Interface):

    def modulo(a, b):
        "devolve o resto da divisão entre dois inteiros"

class AdaptadorDivisorModulador:

    interface.implements(IModulador)
    component.adapts(IOperacoesInteiros)

    def __init__(self, context):
        self.context = context

    def modulo(self, a , b):
        return a - (b*self.context.dividir(a, b))

component.provideAdapter(AdaptadorDivisorModulador)

calc = component.getUtility(IOperacoesInteiros)

mod_calc = IModulador(calc)
print "Módulo:", mod_calc.modulo(23, 5)
